재사용 컴포넌트 제작
고급 엔진 / 재사용 컴포넌트 제작
7.3 재사용 컴포넌트 제작
교재나 시험지를 집필하다 보면 용수철, 도르래, 전기 저항, 접지 기호, 빗금 친 바닥면 벽체와 같이 여러 개의 선과 호로 이루어진 동일한 그래픽 요소를 반복해서 그려야 합니다. Mathit의 component 선언문은 매개변수를 받아 작동하는 커스텀 그래픽 모듈을 만드는 도구입니다.
컴포넌트 선언 구조
컴포넌트는 component 키워드 뒤에 대문자로 시작하는 컴포넌트 이름을 붙이고, 소괄호 안에 입력받을 파라미터들을 나열하여 정의합니다.
component Spring(from: Point, to: Point, coils=8, width=8pt) {
axis_vec = to - from
normal_vec = rot(norm(axis_vec), 90deg) * width
pts = [ on(from--to, t) + normal_vec * sin(t * coils * 2pi)
for t in 0..1, step=0.01 ]
line: pts, stroke=1.2pt
}
구조는 다음과 같습니다.
from: Point와 to: Point는 용수철의 양 끝점이 될 필수 위치 파라미터입니다.
coils=8과 width=8pt는 기본값이 지정된 선택적 파라미터로, 각각 용수철이 감기는 횟수와 진폭 폭을 결정합니다.
pts = [ ... for t in 0..1, step=0.01 ] 구문은 리스트 내포 표현식입니다.
마지막 줄의 line: pts는 계산된 파동 점들을 연결하여 용수철 외형을 완성합니다.
컴포넌트 호출 문법
선언된 컴포넌트는 Mathit의 내장 지시어처럼 콜론(:)을 붙여 간단히 호출합니다.
Spring: from=(0, 5), to=(0, 0), coils=10, width=10pt
Spring: from=(2, 5), to=(6, 2)
첫 번째 호출은 기본값보다 더 조밀하고 굵은 용수철을 수직으로 세우며, 두 번째 호출은 기본 설정을 유지한 채 기울어진 각도로 용수철을 배치합니다. 한 번 정의해 둔 컴포넌트는 문서 전체에서 무제한으로 재사용할 수 있습니다.
물리 시험용 바닥면(빗금 벽체) 컴포넌트
물리학 도판에서 물체가 놓이는 지면이나 고정 벽면을 표현하는 빗금 벽체 컴포넌트 예제입니다.
component Ground(from: Point, to: Point, tick_len=6pt, tick_step=4mm) {
// 바닥 기준선
line: from--to, stroke=1.5pt
// 바닥 기준선 아래로 45도 기울어진 잔빗금 자동 생성
base_len = dist(from, to)
n_ticks = floor(base_len / tick_step)
for i in 0..n_ticks {
P = on(from--to, i / n_ticks)
tick_vec = rot(norm(to - from), -135deg) * tick_len
line: P--(P + tick_vec), stroke=0.8pt, color=#gray
}
}
이 컴포넌트를 사용하면 임의의 두 점만 넘겨도 바닥면이 즉시 생성됩니다.
Ground: from=(-3, 0), to=(5, 0)
---
### 예제
배운 내용을 종합하여, 미지의 각도로 매달려 평형을 이루고 있는 빗면 위의 물체와 용수철 역학 도판을 구현합니다.
@canvas: width=100mm, height=80mm, dpi=300
@view: [-2, 7], [-1, 6]
// 1. 역기하 해결사로 빗면 꼭짓점 위치 탐색
solve {
A = (0, 0)
B = (5, 0)
C = (?, ?)
dist(A, C) == 4
ang(C, A, B) == 30deg
}
// 2. 빗면 다각형 및 바닥 렌더링
poly: A--B--C, stroke=1.5pt, fill=#gray/10
Ground: from=(-1, 0), to=(6, 0)
// 3. 빗면 위의 물체 위치 잡기
P_block = on(C--A, 0.5)
// 4. 용수철 컴포넌트로 꼭대기 C와 물체 P_block 연결
Spring: from=C, to=P_block, coils=6, width=6pt
// 5. 물체 상자 렌더링
rect: center=P_block, w=15pt, h=10pt, rot=30deg, fill=#white, stroke=1.2pt
// 6. 각도 주석
ang: B--A--C, "\(30^\circ\)", r=20pt
dot: C"고정단"(n)
이 코드는 solve 엔진으로 꼭짓점 C를 찾아낸 뒤, 앞서 작성한 Ground와 Spring 모듈을 조합하여 역학 삽화를 완성합니다.